home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 17 / CU Amiga Magazine's Super CD-ROM 17 (1997)(EMAP Images)(GB)[!][issue 1997-12].iso / CUCD / Programming / DiceSource / src / alib / csup / exec_support / CreatePort.c < prev    next >
C/C++ Source or Header  |  1994-02-15  |  4KB  |  137 lines

  1.  
  2.  
  3. #include "exec/types.h"
  4. #include "exec/ports.h"
  5. #include "exec/memory.h"
  6.  
  7. #include "clib/exec_protos.h"
  8.  
  9. // extern APTR AllocMem();
  10. // extern UBYTE AllocSignal();
  11. // extern struct Task *FindTask();
  12.  
  13. extern VOID NewList(struct List *);
  14.  
  15. /*
  16. ******* amiga.lib/CreatePort *************************************************
  17. *
  18. *   NAME
  19. *    CreatePort - Allocate and initialize a new message port
  20. *
  21. *   SYNOPSIS
  22. *    port = CreatePort(name,pri)
  23. *
  24. *    struct MsgPort *CreatePort(STRPTR,LONG);
  25. *
  26. *   FUNCTION
  27. *    Allocates and initializes a new message port. The message list
  28. *    of the new port will be prepared for use (via NewList).  A signal
  29. *    bit will be allocated, and the port will be set to signal your
  30. *    task when a message arrives (PA_SIGNAL).
  31. *
  32. *    You *must* use DeletePort() to delete ports created with
  33. *    CreatePort()!
  34. *
  35. *   INPUTS
  36. *    name - public name of the port, or NULL if the port is not named.
  37. *           The name string is not copied. Most ports do not need names,
  38. *           see notes below on this.
  39. *    pri  - Priority used for insertion into the public port list,
  40. *           normally 0.
  41. *
  42. *   RESULT
  43. *    port - a new MsgPort structure ready for use, or NULL if the port
  44. *           could not be created due to not enough memory or no available
  45. *           signal bit.
  46. *
  47. *   NOTE
  48. *    In most cases, ports should not be named. Named ports are used for
  49. *    rendez-vous between tasks. Everytime a named port needs to be located,
  50. *    the list of all named ports must be traversed. The more named
  51. *    ports there are, the longer this list traversal takes. Thus, unless
  52. *    you really need to, do not name your ports, which will keep them off
  53. *    of the named port list and improve system performance.
  54. *
  55. *   BUGS
  56. *    With versions of amiga.lib prior to V37.14, this function would
  57. *    not fail even though it couldn't allocate a signal bit. The port
  58. *    would be returned with no signal allocated.
  59. *
  60. *   SEE ALSO
  61. *    DeletePort(), exec.library/FindPort(), <exec/ports.h>,
  62. *    exec.library/CreateMsgPort()
  63. *
  64. ******************************************************************************
  65. */
  66. struct MsgPort *CreatePort(name, pri)
  67.     char *name;
  68.     BYTE  pri;
  69. {
  70. LONG            sig;
  71. struct MsgPort *port;
  72.  
  73.     sig = AllocSignal(-1);
  74.     if (sig > 0)
  75.     {
  76.         if (port = AllocMem((ULONG)sizeof(struct MsgPort),MEMF_CLEAR|MEMF_PUBLIC))
  77.         {
  78.             port->mp_Node.ln_Name = name;
  79.             port->mp_Node.ln_Pri  = pri;
  80.             port->mp_Node.ln_Type = NT_MSGPORT;
  81.             port->mp_Flags        = PA_SIGNAL;
  82.             port->mp_SigBit       = sig;
  83.             port->mp_SigTask      = FindTask(NULL);
  84.  
  85.             if (name)
  86.                 AddPort(port);
  87.             else
  88.                 NewList(&port->mp_MsgList);
  89.  
  90.             return(port);
  91.         }
  92.         FreeSignal(sig);
  93.     }
  94.  
  95.     return(NULL);
  96. }
  97.  
  98.  
  99. /*
  100. ******* amiga.lib/DeletePort *************************************************
  101. *
  102. *   NAME
  103. *    DeletePort - free a message port created by CreatePort()
  104. *
  105. *   SYNOPSIS
  106. *    DeletePort(port)
  107. *
  108. *    VOID DeletePort(struct MsgPort *);
  109. *
  110. *   FUNCTION
  111. *    Frees a message port created by CreatePort. All messages that
  112. *    may have been attached to this port must have already been
  113. *    replied before this function is called.
  114. *
  115. *   INPUTS
  116. *    port - message port to delete
  117. *
  118. *   SEE ALSO
  119. *    CreatePort()
  120. *
  121. ******************************************************************************
  122. */
  123.  
  124. VOID DeletePort(port)
  125.     struct MsgPort *port;
  126. {
  127.     if (port->mp_Node.ln_Name)
  128.     RemPort(port);
  129.  
  130.     port->mp_Node.ln_Type    = 0xff;
  131.     port->mp_MsgList.lh_Head = (struct Node *) -1;
  132.  
  133.     FreeSignal(port->mp_SigBit);
  134.  
  135.     FreeMem(port,(ULONG)sizeof(struct MsgPort));
  136. }
  137.